<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 正则表达式 是用与匹配字符串中字符组合的模式 在javaScript中属于对象
        // 经常用于 表单验证 检索替换文本 敏感词替换 提取特定部分

        // 1.利用RegExp对象创建 正则表达式
        var regexp = new RegExp(/123/); //要求输入123
        console.log(regexp);
        // 2.利用字面量 创建正则表达式
        var rg = /123/;
        // 3.test 方法用来检测字符串是否符合正则表达式要求规范
        console.log(rg.test(123)); //true

        // 正则表达式中的特殊字符组合 如:/ab*c/ 特殊字符也称为元字符 如^ $ + 等
        // 参考 MDN 文档 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions#special-caret

        // 边界符 ^ $
        console.log('边界符 ^ $');
        var rag = /abc/; //不需要加引号,无论数字型或者字符串

        // /abc/ 只要含有abc这个字符串返回的都是true
        console.log(rag.test('abc')); //true
        console.log(rag.test('abcd')); //true
        console.log(rag.test('abcde')); //true
        console.log('---------------------------------------');

        var reg = /^abc/; // ^以谁开始 $以谁结束
        console.log(reg.test('abc')); //true
        console.log(reg.test('abcd')); //true
        console.log(reg.test('aabcde')); //false
        console.log('---------------------------------------');

        var reg1 = /^abc$/; //精确匹配 要求必须是 abc 字符串才符合规范
        console.log(reg1.test('abc')); //true
        console.log(reg1.test('abcd')); //false
        console.log(reg1.test('aabcde')); //false
        console.log(reg1.test('abcabc')); //false
        console.log('---------------------------------------');

        // 字符类:
        //  [ ]表示有一系列字符可供选择 只是匹配其中一个就可
        var reg2 = /[abc]/;
        //只要包含有a或者包含有b或者包含有c都返回为true
        console.log(reg2.test('andy')); //true
        console.log(reg2.test('bady')); //true
        console.log(reg2.test('color')); //true
        console.log(reg2.test('red')); //false
        console.log('---------------------------------------');

        var reg3 = /^[abc]$/; //三选一 只有a 或是 b 或是 c 这三个字母才会返回true
        console.log(reg3.test('aa')); //false
        console.log(reg3.test('a')); //true
        console.log(reg3.test('b')); //true
        console.log(reg3.test('c')); //true
        console.log(reg3.test('abc')); //false
        console.log('---------------------------------------');

        var reg4 = /^[a-z]$/; // 26个英文字母任何 一 个小写字母返回true
        console.log(reg4.test('a')); //true
        console.log(reg4.test('z')); //true
        console.log(reg4.test('jpg')); //false
        console.log(reg4.test('A')); //false
        console.log('---------------------------------------');

        // 字符组合
        var reg5 = /^[a-zA-Z0-9_-]$/; // 26个英文字母(大小全含)任何一字母返回true
        console.log(reg5.test('a')); //true
        console.log(reg5.test('B')); //true
        console.log(reg5.test(8)); //true
        console.log(reg5.test('-')); //true
        console.log(reg5.test('_')); //true
        console.log(reg5.test('!')); //false
        console.log(reg5.test('abd')); //false
        console.log('---------------------------------------');

        // 取反 ^
        var reg6 = /^[^a-zA-Z0-9_-]$/; //最里面的^表示取反 不能含有 a-zA-Z0-9_-
        console.log(reg6.test('a')); //false
        console.log(reg6.test('B')); //false
        console.log(reg6.test(8)); //false
        console.log(reg6.test('-')); //false
        console.log(reg6.test('_')); //false
        console.log(reg6.test('!')); //true
        console.log('---------------------------------------');

        // 量次符:用来设定某个模式出现的次数
        console.log('量次符:用来设定某个模式出现的次数');
        // 简单理解就是让下面的a字符重复多少次
        // var reg7 = /^a$/;

        // * 相当于 >=0 可以出现0次或多次
        var reg7 = /^a*$/;
        console.log(reg7.test('')); //true
        console.log(reg7.test('aaaaa')); //true
        console.log('---------------------------------------');

        // + 相当于 >=1 可以出现1次或多次
        var reg8 = /^a+$/;
        console.log(reg8.test('')); //false
        console.log(reg8.test('a')); //false
        console.log(reg8.test('aaaaa')); //true
        console.log('---------------------------------------');

        // ? 相当于 1 || 0 可以出现1次或0次
        var reg9 = /^a?$/;
        console.log(reg9.test('')); //true
        console.log(reg9.test('a')); //true
        console.log(reg9.test('aaaaa')); //false
        console.log('---------------------------------------');

        // {3} 就是重复3次
        var rmg = /^a{3}$/;
        console.log(rmg.test('')); //false
        console.log(rmg.test('a')); //false
        console.log(rmg.test('aaaaa')); //false
        console.log(rmg.test('aaa')); //true
        console.log('---------------------------------------');

        // {3,} 大于等于3次
        var rmg1 = /^a{3,}$/;
        console.log(rmg1.test('')); //false
        console.log(rmg1.test('a')); //false
        console.log(rmg1.test('aaaaa')); //true
        console.log(rmg1.test('aaa')); //true
        console.log('---------------------------------------');

        // {3,6} 大于等于3次 并且小于等于6次
        var rmg2 = /^a{3,6}$/;
        console.log(rmg2.test('')); //false
        console.log(rmg2.test('a')); //false
        console.log(rmg2.test('aaaaa')); //true
        console.log(rmg2.test('aaa')); //true
        console.log(rmg2.test('aaaaaaa')); //false
        console.log('---------------------------------------');

        // \d  匹配0-9之间任一数字,相当于[0-9]
        // \D  匹配所有0-9之外的字符,相当于[^0-9]
        // \w  匹配任意的字母,数字和下划线,相当于[A-Za-z0-9_]
        // \W  除所有字母,数字和下划线外的字符,相当于[^A-Za-z0-9_]
        // \s  匹配空格(包含换行符 制表符 空格符) 相当于[\t\r\n\v\f]
        // \S  匹配非空格字符,相当于[^\t\r\n\v\f]

        var rmg3 = /^[a-zA-Z0-9_-]{6,16}$/;
        //这个模式用户只能输入英文字母 数字 下划线 横线但是有边界符[]这就限定了只能多选1

        var rmg4 = /1[3|4|5|6|7|8]\d{9}/;
        console.log(rmg4.test('15789456128'));

        var ip = '192.168.367.705';
        var rmg5 = /^\d{1,3}(\.\d{1,3}){3}$/;
        console.log(rmg5.test(ip)); //true
    </script>
</body>

</html>